而fts3_expr.c这个文件主要是实现查询字符串功能(MATCH函数)。MATCH运算符用在全文检索中。例如这两句:
SELECT title, body FROM pages WHERE pages MATCH 'world';
SELECT title, body FROM pages WHERE title MATCH 'world';
这两句,前一个 MATCH 左边写了表名,后一个写的是列名。后一个仅搜索title列,前一个是搜索全部列(docid 列以外)。 MATCH右侧的表达式支持模糊查询、支持指定列查询、支持 AND/OR/NEAR/NOT 等运算,例如:
SELECT title, body FROM pages WHERE pages MATCH 'hel*';
SELECT title, body FROM pages WHERE pages MATCH 'title:hello';
SELECT title, body FROM pages WHERE pages MATCH 'hello AND world';
SELECT title, body FROM pages WHERE pages MATCH '(hello NEAR world) OR (program AND language)';
但要注意只能出现一次 MATCH 判断,
WHERE title MATCH 'hello' AND body MATCH 'world';
是不行的,可以改作
WHERE pages MATCH 'title:hello AND body:world';
本模块主要定义了以下几个函数:
函数名 |
函数功能 |
fts3isspace(char c) |
检查参数c是否为空格字符 |
fts3MallocZero(int nByte) |
分配内存字节 |
sqlite3Fts3OpenTokenizer |
打开分词器 |
getNextToken |
提取下一个标记和其他语法分析的信息 |
fts3ReallocOrFree |
扩大内存分配 |
getNextString |
处理整个缓冲输入和创建包含结果的类型为FTSQUERY_PHRASE的Fts3Expr结构体 |
fts3ExprParse |
被函数fts3ExprParse()所引用 |
getNextNode |
查找关键词 |
opPrecedence |
返回一个代表操作优先级的整数 |
insertBinaryOperator |
把二元操作插入查询表达树 |
fts3ExprParse |
解析fts3查询表达式 |
sqlite3Fts3ExprParse |
解析一个查询表达式和创建一个表示已被查询的表达式的Fts3Expr结构体树 |
新的句法支持括号,旧的不支持。
新的句法支持AND和NOT操作,旧的不支持。
旧的句法支持"-"符号是否是合格的验证,而新的句法不支持(以NOT操作代替)。
当使用旧的句法时,OR操作比隐含的AND有更大的优先级,用新句法时,不论是隐式 还是显式的,AND都比OR有更高的优先级。